//package org.noear.quarkus.route;
//
//
//import io.quarkus.runtime.StartupEvent;
//import io.vertx.ext.web.Router;
//import io.vertx.ext.web.RoutingContext;
//import jakarta.enterprise.context.ApplicationScoped;
//import jakarta.enterprise.event.Observes;
//import jakarta.inject.Inject;
//import org.jboss.logging.Logger;
//import io.quarkus.arc.Arc;
//
//@ApplicationScoped
//public class DynamicRouteRegistrar {
//    private static final Logger log = Logger.getLogger(DynamicRouteRegistrar.class);
//
//    // 这个是 quarkus 的路由
//    @Inject
//    Router router;
//
//    void onStart(@Observes StartupEvent ev) {
//        // 这里可以从配置/数据库/其它源读取一组动态路由描述
//        // 例如 key = "/api/doSomething", value = "com.example.MyService#doSomething"
//        // http://localhost:8080/api/hello/MrYang  -> Hello MrYang
//        register("/api/hello/:name", "org.noear.quarkus.path.HelloNamePath#hello");
////        register("/api/sync", "com.example.MyService#doBlockingWork");
//    }
//
//    /**
//     * 路由注册
//     * @param path
//     * @param target
//     */
//    void register(String path, String target) {
//        // 然后这里注册的时候，使用的是 route ，任意模式
////        router.get(path) / router.post(path) / router.put(path) 等：只匹配指定方法。
//        router.route(path).handler(rc -> {
//
//            try {
//                // 解析 target
//                String[] parts = target.split("#");
//                String className = parts[0];
//                String methodName = parts[1];
//                // 这里反射取类是重点，必须这么用才能取到 class ，其次是 class 不要被优化，需要使用 @Unremovable ，注册 bean 的话，需要使用 @ApplicationScoped
//                Class<?> cls = Class.forName(className,false,Thread.currentThread().getContextClassLoader());
//
//                Object bean = Arc.container().instance(cls).get();
//
//                // 这个情况为null ，是因为没有使用 @ApplicationScoped 或 @Singleton 生成bean对象，要注入的话，一般都在 构建阶段完成，所以这里无法获取到
//                if (bean==null)
//                {
//                    bean = cls.getDeclaredConstructor().newInstance();
//                }
//
//                // 简单策略：目标方法接收 RoutingContext 或无参
//                try {
//                    java.lang.reflect.Method m = cls.getDeclaredMethod(methodName, RoutingContext.class);
//                    m.setAccessible(true);
//                    m.invoke(bean, rc);
//                } catch (NoSuchMethodException e) {
//                    // 尝试无参方法
//                    java.lang.reflect.Method m = cls.getDeclaredMethod(methodName);
//                    m.setAccessible(true);
//                    Object ret = m.invoke(bean);
//                    rc.response().end(ret == null ? "" : ret.toString());
//                }
//            } catch (Exception e) {
//                log.error("dynamic route invoke error", e);
//                rc.response().setStatusCode(500).end("invoke error: " + e.getMessage());
//            }
//        });
//    }
//}